#pragma once

#include "Log.hpp"
#include <cerrno>
#include <cstring>
#include <sys/epoll.h>

class Epoller
{
    static const int size = 128;
public:
    Epoller()
    {
        _epfd = epoll_create(size);
        if(_epfd == -1)
            lg(Error, "epoll create error : %s", strerror(errno));
        else
            lg(Info, "epoll create success : %d", _epfd);
    }
    // 获取指定fd下的revents字段，并返回有多少是就绪的
    int EpollerWait(struct epoll_event* revents, int num)
    {
        int n = epoll_wait(_epfd, revents, num, -1);
        return n;
    }
    // 更新指定sock下的事件
    int EpollerUpdate(int op, int sock, uint32_t event)
    {
        int n = 0;
        // 如果是删除操作，就置空即可
        if(op == EPOLL_CTL_DEL)
        {
            n = epoll_ctl(_epfd, op, sock, nullptr);
            if(n)
                lg(Error, "epoll delete error");
        }
        // 如果是其他的操作，需要填写对应的字段
        else
        {
            struct epoll_event ev;
            ev.events = event;
            ev.data.fd = sock;
            n = epoll_ctl(_epfd, op, sock, &ev);
            if(n)
                lg(Error, "epoll ctl error");
        }
        return n;
    }
    ~Epoller()
    {
        if(_epfd > 0)
            close(_epfd);
    }
private:
    int _epfd;
    int _timeout; // 没有使用这个字段
};